/**
 * Spring Security配置类
 * 
 * 功能说明：
 * - 配置Spring Security的安全策略
 * - 定义URL访问权限规则
 * - 配置密码加密器
 * - 配置认证管理器和认证提供者
 * - 禁用CSRF和CORS（由网关统一处理）
 * 
 * 安全策略：
 * - 认证相关接口（/api/auth/**）无需认证即可访问
 * - 健康检查接口（/actuator/**）无需认证即可访问
 * - 其他所有接口都需要认证
 * - 使用无状态会话（STATELESS），适合JWT认证
 * 
 * 密码安全：
 * - 使用BCrypt算法进行密码加密
 * - 加密强度为10（BCrypt默认值）
 * - 支持密码的自动加盐和验证
 * 
 * 认证流程：
 * - 使用自定义的UserDetailsService加载用户信息
 * - 使用DaoAuthenticationProvider进行认证
 * - 支持用户名密码认证方式
 * 
 * @author eCommerce Team
 * @version 1.0
 */
package com.ecommerce.auth.config;

import com.ecommerce.auth.service.CustomUserDetailsService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;

/**
 * Spring Security配置类
 * 负责配置应用的安全策略和认证机制
 */
@Configuration
@EnableWebSecurity
public class SecurityConfig {

    private final CustomUserDetailsService userDetailsService;

    public SecurityConfig(CustomUserDetailsService userDetailsService) {
        this.userDetailsService = userDetailsService;
    }

    /**
     * 安全配置过滤器链
     * 
     * 配置说明：
     * 1. 禁用CORS：由网关服务统一处理跨域请求，避免重复配置
     * 2. 禁用CSRF：使用JWT令牌认证，不需要CSRF保护
     * 3. 无状态会话：适合REST API和JWT认证，不创建HTTP会话
     * 4. URL权限规则：
     *    - /api/auth/**：认证相关接口，无需认证即可访问
     *    - /actuator/**：健康检查接口，无需认证即可访问
     *    - 其他接口：需要认证才能访问
     * 
     * 注意：JWT令牌的验证由网关服务统一处理，此服务只负责令牌生成
     * 
     * @param http Spring Security的HTTP安全配置对象
     * @return 配置好的安全过滤器链
     * @throws Exception 配置过程中可能抛出的异常
     */
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .cors(cors -> cors.disable())  // 禁用CORS，由网关统一处理
            .csrf(csrf -> csrf.disable())
            .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/api/auth/**").permitAll()
                .requestMatchers("/actuator/**").permitAll()
                .anyRequest().authenticated()
            );
        
        return http.build();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    public DaoAuthenticationProvider authenticationProvider() {
        DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
        authProvider.setUserDetailsService(userDetailsService);
        authProvider.setPasswordEncoder(passwordEncoder());
        return authProvider;
    }

    @Bean
    public AuthenticationManager authenticationManager(AuthenticationConfiguration config) throws Exception {
        return config.getAuthenticationManager();
    }
}